package RDD练习

import org.apache.spark.{SparkConf, SparkContext}

object RDDTest02 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[6]").setAppName("Test")
    val sc = new SparkContext(conf)
    //1、创建一个1-10数组的RDD，将所有元素*2形成新的RDD
    val data1 = sc.makeRDD(1 to 10)
    val data1rseult = data1.map(_ * 2).foreach(println(_))
    //2、创建一个10-20数组的RDD，使用mapPartitions将所有元素*2形成新的RDD
    val data2 = sc.makeRDD(10 to 20)
    val data2result = data2.mapPartitions(_.map(_ * 2)).foreach(println(_))
    //3、创建一个元素为 1-5 的RDD，运用 flatMap创建一个新的 RDD，新的 RDD 为原 RDD 每个元素的 平方  和   三次方 来组成 1,1,4,8,9,27..
    val data3 = sc.makeRDD(1 to 5)
    val data3result = data3.flatMap(x => Array(math.pow(x, 2), math.pow(x, 3))).foreach(println(_))
    //4、创建一个 4 个分区的 RDD数据为Array(10,20,30,40,50,60)，使用glom将每个分区的数据放到一个数组
    val array = Array(10, 20, 30, 40, 50, 60)
    val data4 = sc.makeRDD(array, 4)
    val data4result = data4.glom()
    //5、创建一个 RDD数据为Array(1, 3, 4, 20, 4, 5, 8)，按照元素的奇偶性进行分组
    val data5 = sc.makeRDD(Array(1, 3, 4, 20, 4, 5, 8))
    val data5result = data5.groupBy(x => if (x % 2 == 0) "偶数" else "奇数")
    //6、创建一个 RDD（由字符串组成）Array("xiaoli", "laoli", "laowang", "xiaocang", "xiaojing", "xiaokong")，过滤出一个新 RDD（包含“xiao”子串）
    val data6 = sc.makeRDD(Array("xiaoli", "laoli", "laowang", "xiaocang", "xiaojing", "xiaokong"))
    val data6result = data6.filter(_.contains("xiao"))
    //7、创建一个 RDD数据为1 to 10，请使用sample不放回抽样
    val data7 = sc.makeRDD(1 to 10)
    val data7result = data7.sample(false, 0.5, 5)
    //9、创建一个 RDD数据为Array(10,10,2,5,3,5,3,6,9,1),对 RDD 中元素执行去重操作
    val data8 = sc.makeRDD(Array(10, 10, 2, 5, 3, 5, 3, 6, 9, 1))
    val data8result = data8.distinct()
    //10、创建一个分区数为5的 RDD，数据为0 to 100，之后使用coalesce再重新减少分区的数量至 2
    val data9 = sc.makeRDD(1 to 100, 5)
    val data9result = data9.coalesce(3)
    //11、创建一个分区数为5的 RDD，数据为0 to 100，之后使用repartition再重新减少分区的数量至 3
    val data10 = sc.makeRDD(1 to 100, 5)
    val data10reusult = data10.repartition(3)
    //12、创建一个 RDD数据为1,3,4,10,4,6,9,20,30,16,请给RDD进行分别进行升序和降序排列
    val da1 = sc.makeRDD(Seq(1, 3, 4, 10, 4, 6, 9, 20, 30, 16))
    val da1_desc = da1.sortBy(x => x)
    val da1_ase = da1.sortBy(x => x, false)
    val rdd1 = sc.makeRDD(1 to 6)
    val rdd2 = sc.makeRDD(4 to 10)
    //13、创建两个RDD，分别为rdd1和rdd2数据分别为1 to 6和4 to 10，求并集
    val rdd3 = rdd1.union(rdd2)
    //14、创建两个RDD，分别为rdd1和rdd2数据分别为1 to 6和4 to 10，计算差集，两个都算
    val rdd4 = rdd1.subtract(rdd2)
    val rdd5 = rdd2.subtract(rdd1)
    //15、创建两个RDD，分别为rdd1和rdd2数据分别为1 to 6和4 to 10，计算交集
    val rdd6 = rdd1.intersection(rdd2)
    //16、创建两个RDD，分别为rdd1和rdd2数据分别为1 to 6和4 to 10，计算 2 个 RDD 的笛卡尔积
    val rdd7 = rdd1.cartesian(rdd2)
    //17、创建两个RDD，分别为rdd1和rdd2数据分别为1 to 5和11 to 15，对两个RDD拉链操作
    val rdd8 = rdd1.zip(rdd2)
  }
}
